package 二叉树;

import jdk.nashorn.api.tree.Tree;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 897. Increasing Order Search Tree
 * https://leetcode.com/problems/increasing-order-search-tree/
 *
 * Given a binary search tree, rearrange the tree in in-order
 * so that the leftmost node in the tree is now the root of the tree,
 * and every node has no left child and only 1 right child.
 *
 * Example 1:
 * Input: [5,3,6,2,4,null,8,1,null,null,null,7,9]
 *
 *        5
 *       / \
 *     3    6
 *    / \    \
 *   2   4    8
 *  /        / \
 * 1        7   9
 *
 * Output: [1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
 *
 *  1
 *   \
 *    2
 *     \
 *      3
 *       \
 *        4
 *         \
 *          5
 *           \
 *            6
 *             \
 *              7
 *               \
 *                8
 *                 \
 *                  9
 * Note:
 * The number of nodes in the given tree will be between 1 and 100.
 * Each node will have a unique integer value from 0 to 1000.
 *
 */
public class E_897_递增顺序查找树 {

    /**
     * 先中序在生成树
     */
    public TreeNode increasingBST(TreeNode root) {
        List<Integer> results = new ArrayList<>();
        inorder(root, results);

        TreeNode node = new TreeNode(0);
        TreeNode temp = node;
        for (Integer number: results) {
            temp.right = new TreeNode(number);
            temp = temp.right;
        }

        return node.right;
    }

    public void inorder(TreeNode node, List<Integer> results) {
        if (node == null) return;
        inorder(node.left, results);
        results.add(node.val);
        inorder(node.right, results);
    }

    /**
     * 中序更改树的生成
     */
    TreeNode cur;
    public TreeNode increasingBST2(TreeNode root) {
        TreeNode ans = new TreeNode(0);
        cur = ans;
        inorder(root);
        return ans.right;
    }

    public void inorder(TreeNode node) {
        if (node == null) return;
        inorder(node.left);
        node.left = null;
        cur.right = node;
        cur = node;
        inorder(node.right);
    }

}
